import datetime
import jwt
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from rest_framework.exceptions import AuthenticationFailed

# key = '123456dfdasf'

def generate_jwt_token(payload):
    """
    根据提供的 payload 和 Django 配置中的 SECRET_KEY 生成 JWT token。

    参数:
        payload (dict): 要编码到 JWT token 中的数据。

    返回:
        str: 生成的 JWT token。

    异常:
        ImproperlyConfigured: 如果 Django 设置中没有正确配置 SECRET_KEY。
    """
    try:
        # 检查 SECRET_KEY 是否在 Django 设置中配置
        secret_key = settings.SECRET_KEY
        if not secret_key:
            raise ImproperlyConfigured('Django 设置中缺少 SECRET_KEY。')

        # 使用 payload 和 SECRET_KEY 生成 JWT token
        token = jwt.encode(payload=payload, key=secret_key, algorithm='HS256')

        return token

    except Exception as e:
        # 捕获生成 token 时的任何错误
        raise Exception(f"生成 JWT token 时出错: {str(e)}")


def decode_jwt_token(token):
    """
    解码并验证 JWT token。

    参数:
        token (str): 要解码的 JWT token。

    返回:
        dict: 解码后的 payload。

    异常:
        AuthenticationFailed: 如果 token 无效或过期。
    """
    try:
        # 解码 token，验证签名并检查过期时间
        payload = jwt.decode(token, settings.SECRET_KEY, algorithms=['HS256'])

        # 这里可以自定义其他的验证，如验证 token 中的自定义字段

        # 返回解码后的有效载荷
        return payload

    except jwt.ExpiredSignatureError:
        raise AuthenticationFailed('Token has expired.')
    except jwt.InvalidTokenError:
        raise AuthenticationFailed('Invalid token.')
    except Exception as e:
        raise AuthenticationFailed(f'Token validation failed: {str(e)}')


if __name__ == '__main__':
    token = generate_jwt_token({
        'user_id': 1,
        'username': 'admin',
        'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=30)
    })
    print("generate_jwt_token:",token)

    payload = decode_jwt_token(token)
    print("decode_jwt_token:",payload)